import { API_PREFIX } from '../constants/setting';
import { getStore } from '../core/createApp';
import { object2Query } from '../utils/url';
import { API_LOGOUT } from '../constants/api';
import toast from '../utils/toast';

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};
function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  }
  const errortext = codeMessage[response.status] || response.statusText;
  const error = new Error(errortext);
  error.name = response.status;
  error.response = response;
  throw error;
}

function callApi({
  api,
  params = {},
  method = 'POST',
  others = {},
  showErr = true,
}) {
  const finalParams = {
    ...params,
  };
  let queryStr;
  if (finalParams && method === 'GET') {
    queryStr = `?${object2Query(finalParams)}`;
  } else {
    queryStr = '';
  }
  const url = `${API_PREFIX}${api}${queryStr}`;

  console.log('请求接口:', api, 'params:', finalParams, 'method:', method, 'url:', url);
  const store = getStore();
  const state = store.getState();
  console.log('---', state);
  return fetch(url, {
    credentials: 'include',
    method,
    headers: {
      'Content-Type': 'application/json',
      'youyuer-cm-token': state.user.getIn(['user', 'token']),
      source: window.source,
    },
    body: method === 'POST' ? JSON.stringify(finalParams) : null,
  }).then(checkStatus)
    .then(response => response.json())
    .then((json) => {
      const result = {
        ...json,
        success: json.code === '000000',
        params,
        others,
      };
      if (json.code === 'user0020' && api.indexOf(API_LOGOUT) === -1) {
        toast('请退出重新登录');
        store.dispatch({
          type: 'user/updateUser',
          payload: null,
        });
      } else if (showErr && !result.success) {
        toast(`${result.msg || '请求失败'}`);
      }
      return result;
    })
    .catch((e) => {
      console.error(e);
      return {
        success: false,
        msg: '网络异常',
      };
    });
}

export default callApi;
